<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原型对象</title>
</head>
<body>
<h3>原型对象</h3>
<p>
    构造函数通过原型分配的函数是所有对象所 共享的。  <br>
    JavaScript 规定，每一个构造函数都有一个 prototype 属性，指向另一个对象，所以我们也称为原型对象  <br>
    这个对象可以挂载函数，对象实例化不会多次创建原型上函数，节约内存  <br>
    我们可以把那些不变的方法，直接定义在 prototype 对象上，这样所有对象的实例就可以共享这些方法。  <br>
    构造函数和原型对象中的this 都指向 实例化的对象
</p>
<hr>

<pre style="font-size: 20px;">
    总结
1. 原型对象是什么 ？
    一个对象，我们也称为 prototype 为原型对象
2. 原型对象的作用是什么 ？
    共享 对象方法
    可以把那些不变的方法，直接定义在 prototype 对象上
3. 构造函数和原型里面的this指向谁 ？
    实例化的对象
</pre>
<hr>


<script>
    // 构造函数  公共的属性和方法 封装到 '明星' 构造函数里面了
    // 1.公共的属性写到 构造函数里面
    function 明星(姓名, 年龄) {
        this.姓名 = 姓名
        this.年龄 = 年龄
    }

    // 2. 公共的方法写到原型对象身上   节约了内存
    // prototype 是原型,指向另一个对象
    明星.prototype.唱 = function () {
        // console.log('唱歌')
        console.log(`${this.姓名} 唱歌`)
        // this指向,实例对象
    }

    // 创建实例对象
    const 刘德华 = new 明星('刘德华', 55)
    const 张学友 = new 明星('张学友', 58)

    // 对象.方法
    刘德华.唱() //调用
    张学友.唱() //调用

    // 实例对象之间不会互相影响
    console.log(刘德华 === 张学友)  // false
    console.log(刘德华.唱 === 张学友.唱) // true, 证明 '唱' 方法,是一个

    console.dir(明星.prototype) // 输出的是, 对象
</script>

</body>
</html>